from importlib.metadata import version  # 导入版本模块
import tiktoken  # 导入tiktoken库
print("tiktoken version:", version("tiktoken"))  # 打印tiktoken版本

tokenizer = tiktoken.get_encoding("gpt2") # 实例化BPE分词器
'''
text = "Hello, do you like tea? <endoftext> In the sunlit terraces of someunknownPlace."  # 示例文本

integers = tokenizer.encode(text, allowed_special={"<|endoftext|>"})  # 编码文本，允许特殊词元
print(integers)  # 打印编码后的整数
# 代码打印以下词元ID：
# [15496, 11, 466, 345, 588, 8887, 30, 1279, 437, 1659, 5239, 29, 554, 262, 4252, 18250, 8812, 2114, 286, 617, 34680, 27271, 13]
strings = tokenizer.decode(integers)  # 解码词元ID
print(strings)  # 打印解码后的文本
# 上面的代码打印以下内容：
# 'Hello, do you like tea? <endoftext> In the sunlit terraces of someunknownPlace.'
'''

with open("the-verdict.txt", "r", encoding="utf-8") as f:  # 打开文本文件
    raw_text = f.read()  # 读取文本内容

enc_text = tokenizer.encode(raw_text)  # 对文本进行编码
print(len(enc_text))  # 打印编码后的词元数量
# 执行上述代码将返回5145，这是应用BPE分词器后的训练集中词元的总数量。
enc_sample = enc_text[50:]  # 移除前50个词元
context_size = 4  # 上下文大小确定输入中包含的词元数量
x = enc_sample[:context_size]  # 获取上下文大小的输入
y = enc_sample[1:context_size+1]  # 获取右移1位的目标
print(f"x: {x}")  # 打印输入
print(f"y: {y}")  # 打印目标
# 运行上述代码打印以下输出：
# x: [290, 4920, 2241, 287]
# y: [4920, 2241, 287, 257]
for i in range(1, context_size+1):  # 遍历上下文大小
    context = enc_sample[:i]  # 获取当前上下文
    desired = enc_sample[i]  # 获取目标词元
    print(context, "---->", desired)  # 打印上下文和目标
# 上述代码打印以下内容：
# [290] ----> 4920
# [290, 4920] ----> 2241
# [290, 4920, 2241] ----> 287
# [290, 4920, 2241, 287] ----> 257
for i in range(1, context_size+1):  # 遍历上下文大小
    context = enc_sample[:i]  # 获取当前上下文
    desired = enc_sample[i]  # 获取目标词元
    print(tokenizer.decode(context), "---->", tokenizer.decode([desired]))  # 打印解码后的上下文和目标
# 下面的输出显示了输入和输出在文本格式中的样子：
# and ----> established
# and established ----> himself
# and established himself ----> in
# and established himself in ----> a









